package com.vecspace.dayu.code.service;

import java.util.Date;
import java.util.List;
import org.springframework.stereotype.Service;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import com.vecspace.dayu.code.dao.DataColumnDao;
import com.vecspace.dayu.code.pojo.DataColumn;
import com.vecspace.exception.HException;
import com.vecspace.utils.AnnoUtil;
import com.vecspace.utils.Assert;
import com.vecspace.utils.Convert;
import com.vecspace.utils.NumberUtil;

/**功能描述 DAYU-字段定义的增、删、改查等业务操作的service类
 * @author wanghua
 */
@Service("dayu_dataColumnService")
public class DataColumnService {
	/** 根据ID查询 DAYU-字段定义 
	 * @param id   主键值
	 * @return DataColumn
	 * @throws Exception
	 * @author wanghua
	 */
	public DataColumn getDataColumn(Long id) throws Exception{
		return dataColumnDao.getDataColumn(id);
	}
	
	/**根据表id获取所有字段
	 * 
	 * @param datatableId
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public List<DataColumn> getDataColumns(Long datatableId) throws Exception {
		return dataColumnDao.getDataColumns(datatableId);
	}
	
	/**根据id（多个）查询字段
	 * 
	 * @param tableColumnIds
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public List<DataColumn> getDataColumns(List<Long> tableColumnIds) throws Exception{
		return dataColumnDao.getDataColumns(tableColumnIds);
	}

	/***将页面上传入的对象转为持久化对象（如果页面对象是一个新对象，则insert;否则从数据库库查询出已有的对象item2，将传入的值赋值给item2，然后将item2 update到数据库）
	 * 根据页面上放置的属性个数，需要对下面的属性设置进行调整。
	 * 对于无法在页面上进行修改的属性，不要进行设值。
	 * @param item item是由页面传递过来的对象，item中的属性并不完整，对于在页面上没有展示的属性，item中一律会是空值，而数据库中这些属性可以是有值的
	 * @return DataColumn
	 * @throws Exception
	 * @author wanghua
	 */
	public DataColumn saveViewDataColumn(DataColumn item, String loginUserId) throws Exception {
		if (item == null){
			return null;
		}
		/*** 下面开始对item对象的页面传值进行校验，如必填项，格式等 ***/
		//Assert.throwz(StringUtils.isNotBlank() , "条件不满足时抛出异常");
		/*** 结束校验 ***/
		
		DataColumn item2;
		if (NumberUtil.isNotNullZero(item.getId())) {
			/**从数据库中取出原始对象，将从页面传过来的新值赋值给原始对象，并将原始对象再保存到数据库中 **/
			item2 = getDataColumn(item.getId());
			if (item2 != null) {
				/*** 将页面上的新值逐一赋值，不在页面上的属性不要进行赋值 ***/
				//item2.setDatatableId(item.getDatatableId());//更新表ID
				item2.setColumnName(item.getColumnName());//更新字段名
				item2.setColumnCaption(item.getColumnCaption());//更新字段中文名
				item2.setColumnAliasName(item.getColumnAliasName());//更新字段别名
				item2.setDataType(item.getDataType());//更新数据类型
				item2.setDataLength(item.getDataLength());//更新数据长度
				item2.setDataScale(item.getDataScale());//更新小数位数
				item2.setUnit(item.getUnit());//更新数量单位
//				item2.setCustDataType(item.getCustDataType());//更新自定义数据类型
				item2.setMinCharLength(item.getMinCharLength());//更新最大字符数
				item2.setMaxCharLength(item.getMaxCharLength());//更新最少字符数
				item2.setMaxValue(item.getMaxValue());//更新最大值
				item2.setMinValue(item.getMinValue());//更新最小值
				item2.setCodeType(StringUtils.trim(item.getCodeType()));//更新代码类型
				item2.setRefTableName(item.getRefTableName());//更新参考表名
				item2.setRefIdColumn(item.getRefIdColumn());//更新参考表ID字段
				item2.setRefNameColumn(item.getRefNameColumn());//更新参考表名称字段
				item2.setRefNameColumnAliasName(item.getRefNameColumnAliasName());//更新参考表名称字段别名
				item2.setCharsetType(item.getCharsetType());//更新字符集
				item2.setOrdnum(item.getOrdnum());//更新顺序号

				/**end**/
			} else {
				item2 = item;
			}
		}else{ //item是新增加的对象
			item2 = item;
		}
		saveDataColumn(item2, loginUserId);
		return item2;
	}
	
	/** 插入或修改 DAYU-字段定义 ，item中的所有属性都会更新到数据库中（包括属性值为null的，也会将null更新到数据库，覆盖之前的值）。
	 * @param item	要保存的对象
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void saveDataColumn(DataColumn item, String loginId) throws Exception{
		if (item == null){
			return;
		}
		/*** 下面开始对item对象进行校验，如逻辑关系等 ***/
		Assert.throwz(NumberUtil.isNotNullZero(item.getDatatableId()), "DatatableId不能为空");
		/*** 结束校验 ***/
		Date date = new Date();
		if (NumberUtil.isNullOrZero(item.getId())) {

			item.setId(null);
			item.setCreateTime(date);
			item.setCreateUser(loginId);//更新记录创建人ID

		} else {

		}
		dataColumnDao.saveDataColumn(item);
	}

	public void saveColumns(Long tableId, List<DataColumn> columns) throws Exception {
		for(DataColumn col : columns){
			col.setDatatableId(tableId);
			this.saveDataColumn(col, "");
		}
	}
	/**更新单个字段的值
	 * 
	 * @param id
	 * @param propName
	 * @param valueText
	 * @return
	 * @throws Exception 
	 * @author wanghua
	 */
	public void updateProp(Long id, String propName, String valueText) throws Exception {
		Object value = valueText;
		String columnName = null;
		if("columnCaption".equals(propName)
				|| "columnAliasName".equals(propName)
				|| "columnType".equals(propName)
				|| "unit".equals(propName)
				|| "custDataType".equals(propName)
				|| "codeType".equals(propName)
				|| "charsetType".equals(propName)) {
			columnName = AnnoUtil.getColumnNameByPropName(DataColumn.class, propName);
			
		}else if("maxValue".equals(propName)
				|| "minValue".equals(propName)) {			
			value = Convert.toBigDecimal(valueText);			
			columnName = AnnoUtil.getColumnNameByPropName(DataColumn.class, propName);
			
		}else if("dataLength".equals(propName) || "dataScale".equals(propName)
				|| "minCharLength".equals(propName)
				|| "maxCharLength".equals(propName)) {			
			value = Convert.toInteger(valueText, null);			
			columnName = AnnoUtil.getColumnNameByPropName(DataColumn.class, propName);
			
		}else if("ordnum".equals(propName)) {
			value = Convert.toInt(valueText, 0);
			columnName = AnnoUtil.getColumnNameByPropName(DataColumn.class, propName);
		}
		
		if(columnName != null) {
			dataColumnDao.updateValue(id, columnName, value);
		}else if("refColumnInfo".equals(propName)) {
			String refInfo = valueText;// T_XXX.ID,NAME XX_NAME
			if(refInfo != null) {
				String refTableName = "";
				String refIdColumn = "";
				String refNameColumn = "";
				String refNameColumnAlias = "";
				refInfo = refInfo.trim().toUpperCase();
				int dotIdx = refInfo.indexOf(".");
				if(dotIdx > 0) {
					refTableName = refInfo.substring(0, dotIdx); //TBM_PROJECT
					String refColumnsStr = refInfo.substring(dotIdx + 1);//ID,NAME PROJECT_NAME
					if(refColumnsStr == null) refColumnsStr = "";
					String[] refColumnArr = refColumnsStr.split(",|，");
					if(refColumnArr.length > 0) {
						refIdColumn = refColumnArr[0].trim();
					}
					if(refColumnArr.length > 1) {
						String refNameColumnStr = refColumnArr[1];
						if(refNameColumnStr == null) refNameColumnStr = "";
						refNameColumnStr = refNameColumnStr.trim();
						int blankIdx = refNameColumnStr.indexOf(" ");
						if(blankIdx > 0) {
							refNameColumn = refNameColumnStr.substring(0, blankIdx).trim();
							refNameColumnAlias = refNameColumnStr.substring(blankIdx).trim();
						}
					}
				}
				if(StringUtils.isNotBlank(refTableName) && StringUtils.isNotBlank(refIdColumn)) {
					DataColumn dataColumn = this.getDataColumn(id);
					dataColumn.setRefTableName(refTableName);
					dataColumn.setRefIdColumn(refIdColumn);
					dataColumn.setRefNameColumn(refNameColumn);
					dataColumn.setRefNameColumnAliasName(refNameColumnAlias);
					this.saveDataColumn(dataColumn, "");
				}
			}
		}
		else throw new HException("不能识别的属性名：" + propName);
	}
	
	/** 根据ID删除 DAYU-字段定义 
	 * @param id	主键值
	 * @return void
	 * @throws Exception
	 * @author wanghua
	 */
	public void deleteDataColumn(Long id) throws Exception{		
		dataColumnDao.deleteDataColumn(id);
	}
	
	public void deleteDataColumns(Long tableId) throws Exception{		
		dataColumnDao.deleteDataColumns(tableId);
	}
		
	/** property **/
	@Autowired
	private DataColumnDao dataColumnDao;
}
